package com.xiaohe.gulimall.authserver.controller;

import com.google.gson.Gson;
import com.xiaohe.gulimall.authserver.utils.ConstantWxUtils;
import com.xiaohe.gulimall.authserver.utils.HttpClientUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;

@Controller
@RequestMapping("api/ucenter/wx")
public class WxApiController {


    /**
     * 生成二维码
     * @return
     */
    @GetMapping(value = "/login")
    public String getWxCode() throws UnsupportedEncodingException {

        //微信开发平台授权baseUrl   %s相当于？表示占位符
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";

        //对redirect_url进行URLEncoder编码
        String redirect_url = ConstantWxUtils.WX_OPEN_REDIRECT_URL;
        redirect_url = URLEncoder.encode(redirect_url,"UTF-8");

        // 防止csrf攻击（跨站请求伪造攻击）
        //String state = UUID.randomUUID().toString().replaceAll("-", "");//一般情况下会使用一个随机数
        String state = "hjl.mynatapp.cc";//为了让大家能够使用我搭建的外网的微信回调跳转服务器，这里填写你在ngrok的前置域名
        System.out.println("state = " + state);
        // 采用redis等进行缓存state 使用sessionId为key 30分钟后过期，可配置
        //键： "wechar-open-state-" + httpServletRequest.getSession().getId()
        //值： satte
        //过期时间： 30分钟
        //生成qrcodeUrl

        //设置%s中的值
        String url = String.format(
                baseUrl,
                ConstantWxUtils.WX_OPEN_APP_ID,
                redirect_url,
                "xunqi"
        );

        //重定向到请求微信地址
        return "redirect:" + url;
    }

    @GetMapping("callback")
    public String callback(String code,String state){
        //1、获取code值
        //得到授权临时票据code
        System.out.println(code);
        System.out.println(state);
        //2、使用code请求腾讯的固定一个值，得到两个值access_token和openid
        String baseAccessTokenUrl= null;
        try {
            baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token"+
                    "?appid=%s"+
                    "&secret=%s"+
                    "&code=%s"+
                    "&grant_type=authorization_code";
            //拼接三个参数
            String accessTokenUrl= String.format(baseAccessTokenUrl,
                    ConstantWxUtils.WX_OPEN_APP_ID,
                    ConstantWxUtils.WX_OPEN_APP_SECRET,
                    code);
            //请求这个拼接好的地址，获取两个返回值access_token和openid
            //使用httpClient发送请求，得到返回结果
            String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
            //从accessTokenInfo获取到access_token和openid
            //将accessTokenInfo转换成Map集合
            //使用json转换工具
            Gson gson=new Gson();
            HashMap mapAccessToken= gson.fromJson(accessTokenInfo, HashMap.class);
            //从Map集合获取access_token和openid
            String access_token= (String) mapAccessToken.get("access_token");
            String openid= (String) mapAccessToken.get("openid");
            //拿着access_token和openid,回去请求微信提供的固定地址，获取扫码人的信息
            String baseUserInfoUrl="https://api.weixin.qq.com/sns/userinfo"+
                    "?access_token=%s"+
                    "&openid=%s";
            //拼接参数
            String userInfoUrl= String.format(baseUserInfoUrl,
                    access_token,
                    openid);
            //采用httpClien发送请求，获取信息
            String userInfo = HttpClientUtils.get(userInfoUrl);
            //获取返回值userInfo的内容
            HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
            String nickname = (String) userInfoMap.get("nickname");
            String headimgurl = (String) userInfoMap.get("headimgurl");
            //将扫码人信息添加到数据库中
            //判断数据库中是否有该用户的信息

            //最后，返回页面,通过路径传递个值
            return "redirect:http://gulimall.com";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:http://auth.gulimall.com/login.html";
    }
}
